// 导入 http 模块
import http from 'wechat-http'
/**
 * 配置接口基础路径
 */
http.baseURL = 'https://live-api.itheima.net'

/**
 * 请求拦截器
 */
http.intercept.request = confirm => {
  // 先拿到app里的内容
  const app = getApp()
  // 先判断app是否有token(登录)
  if (app.token) {
    confirm.header = {
      // 将app里的token当做请求头携带
      Authorization: `Bearer ${app.token}`,
      // 添加请求头的同时，还要保留原来的请求头信息，并且以传递过来的为主
      ...confirm.header
    }
  }
  return confirm
}
/**
 * 响应拦截器
 */
http.intercept.response = async res => {
  // 先获取到app里的值
  const app = getApp()
  // 返回的状态码为 401，代表 token 过期
  if (res.statusCode === 401) {
    // 假如urI包含了 /refreshToken ,说明 /refreshToken 刷新也失效了，只能去登录页
    //includes 判断字符串是否包含
    if (res.config.url.includes('/refreshToken')) {
      // 获取页面信息
      const pages = getCurrentPages()
      // 获取当前页面
      const current = pages[pages.length - 1]
      // 跳转时携带当前页面信息
      wx.navigateTo({ url: '/pages/login/index?redirect=' + current.route })
      return
    }
    // 将refreshToken作为参数请求数据的到新的token和refreshToken
    const result = await wx.http({
      url: '/refreshToken',
      method: 'POST',
      header: { Authorization: `Bearer ${app.refreshToken}` }
    })
    // console.log(result)
    // 解构
    const { token, refreshToken } = result.data
    // 将新的token和refreshToken传给app
    app.setToken(token, refreshToken)
    // 再发请求失败的 ur1 发送，拿回来数据，那么在用户的角度，就是无感刷新(无感请求)
    // 补发第一步的事件
    return wx.http({
      ...res.config,
      // 把新的token重新发一彼岸
      header: { Authorization: `Bearer ${app.token}` }
    })
  }

  // 判断返回回来的数据是否成功
  if (res.data.code === 10000) {
    // 成功返回剥离后的数据
    return res.data
  } else {
    // 失败则返回错误
    return Promise.reject()
  }
}

/**
 * 挂载方法到全局
 */
wx.http = http
/**
 * 模块导出
 */
export default http
